package com.imooc.mq;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 广播发布订阅模式:
 * 生产者生产10条消息，多个队列绑定生产者，多个队列各自获得10条消息
 * @author liansen
 * @create 02-17-16:14
 */
public class PublishDemo {

    public static void main(String[] args) throws IOException, TimeoutException {

        //创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.31.68");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        //通过工厂创建连接
        Connection connection = factory.newConnection();
        //创建信道
        Channel channel = connection.createChannel();

        /**
         * 创建交换机
         * String exchange, 交换机名称
         * BuiltinExchangeType type, 交换机类型
         *    DIRECT("direct"), 定向投递，交换机把消息发给指定routing key的队列
         *    FANOUT("fanout"), 发布订阅，交换机把消息发给所有绑定交换机的队列
         *    TOPIC("topic"),   通配符模式, 把消息发给符合routing pattern的队列
         *    HEADERS("headers"); 使用不多，参数匹配
         * boolean durable, 是否持久化
         * boolean autoDelete, 是否自动删除
         * boolean internal, true:表示当前交换机是mq内部使用的，我们创建的队列不会消费该类型交换机下的消息, 所以一般设为false
         * Map<String, Object> arguments map类型的参数
         *
         * Declare:声明的意思
         */
        String exchange = "fanout_exchange";
        channel.exchangeDeclare(exchange, BuiltinExchangeType.FANOUT, true, false, false, null);

        //创建两个队列
        /**
         * String queue, 队列名称
         * boolean durable, 是否持久化
         * boolean exclusive, 是否独占,true:只能有一个消费者监听这个队列, 一般设为false
         * boolean autoDelete, 是否自动删除, true:当没有消费者时,自动删除队列
         * Map<String, Object> arguments map类型参数
         */
        String fanout_queue_a = "fanout_queue_a";
        String fanout_queue_b = "fanout_queue_b";
        channel.queueDeclare(fanout_queue_a, true, false, false, null);
        channel.queueDeclare(fanout_queue_b, true, false, false, null);

        //绑定交换机和队列,
        /**
         * String queue, 队列
         * String exchange, 交换机
         * String routingKey 路由键，发布订阅模式广播给所有订阅者，不用路由键
         */
        channel.queueBind(fanout_queue_a, exchange, "");
        channel.queueBind(fanout_queue_b, exchange, "");

        for(int i=0; i<10; i++){
            String msg = "开始上班, 任务[" + i + "]";
            channel.basicPublish(exchange, "", null, msg.getBytes());
        }

        channel.close();
        connection.close();
    }
}
